package com.demo.gereric;

import java.lang.reflect.Method;
import java.util.ArrayList;
import java.util.List;

/**
 * 利用类型擦除的原理，用反射的手段就绕过了正常开发中编译器不允许的操作限制。
 */
public class EraseReflectDemo {
	public static void main(String[] args) {
		List<Integer> list = new ArrayList<>();
		list.add(123);
		// 编译不通过
//		list.add("23");

		List<String> list1 = new ArrayList<>();
		System.out.println(list.getClass());

		list1 = method(list);

		for (Object o : list1) {
			System.out.println(o);
		}
	}

	private static List method(final List<Integer> list) {
		try {
			Method method = list.getClass().getDeclaredMethod("add", Object.class);
			// 因为泛型的类型擦除机制，通过反射可以设置非 Integer 的值
			method.invoke(list, "test");
			method.invoke(list, 43.4f);
			return list;
		} catch (Exception e) {
			e.printStackTrace();
		}
		return null;
	}
}
